home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / serien / purity / nr.22 / magicblank / magicblank.p < prev    next >
Text File  |  1995-04-23  |  20KB  |  702 lines

  1. { ****** Auto-Revision (do NOT edit) ********************
  2.   *
  3.   * © Copyright by BOMBERSOFT
  4.   *
  5.   * Filename          : MagicBlank.p
  6.   * Created on        : 20.12.1993
  7.   * Created by        : Björn Schotte
  8.   * Current revision  : V1.41
  9.   *
  10.   *
  11.   * Purpose: Allround-Utility (Hauptfunktion: Blanking)
  12.   *
  13.   *
  14.   * V1.41  : 20.12.1993 : CLI-Interface hinzugefügt. Ab 
  15.   *                       Version 1.5 wird dann ein 
  16.   *                       extra Prefs-Programm 
  17.   *                       hinzukommen, mit dem sich die 
  18.   *                       Einstellungen komfortabel 
  19.   *                       verwalten lassen =8)
  20.   *
  21.   * V1.400 : 17.11.1993 : - Initial release -
  22.   ******************************************************* }
  23.  
  24.  
  25. USES ExecIO, Exec, Custom, Intuition, Graphics;
  26.  
  27. LABEL weiter;
  28.  
  29. {$opt b-,q;
  30.   incl "exec/interrupts.h",
  31.        "devices/input.h",
  32.        "devices/inputevent.h",
  33.        "intuition/intuitionbase.h",
  34.        "CLI.i",
  35.        "libraries/dos.h"}
  36.  
  37. CONST
  38.   ver = "$VER: MagicBlank V1.40 (13.11.1993)";
  39.  
  40.   COM_EDIT = -1;
  41.   COM_UHR  = -2;
  42.  
  43.   portname = "MagicBlank-Port";
  44.  
  45.   SBF_C = SIGBREAKF_CTRL_C;
  46.   SBF_D = SIGBREAKF_CTRL_D;
  47.   SBF_E = SIGBREAKF_CTRL_E;
  48.   SBF_F = SIGBREAKF_CTRL_F;
  49.   SBF_CF= SIGBREAKF_CTRL_C OR SIGBREAKF_CTRL_F;
  50.  
  51.   configname = ":s/MagicBlank.cfg"; { Konfigdatei }
  52.   configID   = "MagicBlank-Konfigurationsdatei";
  53.  
  54. TYPE
  55.   CodeTyp = Array[1..15] of Word;
  56.   { Positionen der Sterne plus "Geschwindigkeit": }
  57.   StarPos = RECORD
  58.     x,y    : Integer;
  59.     speedx : Integer;
  60.   END;
  61.  
  62. VAR
  63.   Arg                : ARRAY[1..10] OF STRING[80];
  64.   MouseTime,MTime    : LONG;
  65.   port               : p_MsgPort;
  66.   ioreq              : ^IOStdReq;
  67.   inter              : Interrupt;
  68.   err                : BYTE;
  69.   ThisTask           : p_Task;
  70.   Sig, SigBit,
  71.   ScreenTime,
  72.   zähler,
  73.   prio,
  74.   MouseFactor,
  75.   sig1               : LONG;
  76.   _paslibbase        : BYTE; IMPORT;
  77.   InterfaceCode      : Codetyp;
  78.   done,
  79.   blanked,
  80.   ok,
  81.   Linkshänder,
  82.   MMBShift           : BOOLEAN;
  83.   ns                 : NewScreen; STATIC;
  84.   sp                 : p_Screen; STATIC;
  85.   star               : Array[1..12] Of StarPos;
  86.   i,zuf              : INTEGER;
  87.   rp                 : p_RastPort;
  88.   f                  : Text;
  89.   BlankNum           : 1..5;
  90.   mask, Kommando     : LONG;
  91.   lpressed, shifted,
  92.   ScreenSwitcher     : BOOLEAN;
  93.   IBase              : p_IntuitionBase;
  94.  
  95. {*********************************************************
  96.  ** MausPort setzen.                                    **
  97.  **                                                     **
  98.  **   1 für GamePort, 0 für MausPort                    **
  99.  *********************************************************}
  100. PROCEDURE ChangeMPort(VAR ioreq:p_IOStdReq; MPort:BYTE);
  101. VAR
  102.   p   : ^BYTE;
  103.   err : INTEGER;
  104. BEGIN
  105.   p := PTR(Addr(MPort));
  106.  
  107.   ioreq^.io_Command := IND_SETMPORT;
  108.   ioreq^.io_Data    := p;
  109.   ioreq^.io_Length  := 1;
  110.  
  111.   err := DoIO(p_IORequest(ioreq));
  112. END;
  113.  
  114. {*********************************************************
  115.  ** Schaltet die Sprites ab.                            **
  116.  *********************************************************}
  117. PROCEDURE SPRITE_OFF;
  118. BEGIN
  119.   cc.dmacon := 0 + $20;
  120. END;
  121.  
  122. {*********************************************************
  123.  ** Schaltet die Sprites ein.                           **
  124.  *********************************************************}
  125. PROCEDURE SPRITE_ON;
  126. BEGIN
  127.   cc.dmacon := $8000 + $20;
  128. END;
  129.  
  130. {*********************************************************
  131.  ** Löscht unsere Kommando-Variable.                    **
  132.  *********************************************************}
  133. PROCEDURE ClearKommando;
  134. BEGIN
  135.   Kommando := 0;
  136. END;
  137.  
  138. {*********************************************************
  139.  ** Setzt unsere Kommando-Variable.                     **
  140.  *********************************************************}
  141. PROCEDURE SetKommando(com : LONG);
  142. BEGIN
  143.   Kommando := com;
  144. END;
  145.  
  146. {*********************************************************
  147.  ** Setzt die MouseBlanker-Zeit auf ihren alten Wert zu-**
  148.  ** rück.                                               **
  149.  *********************************************************}
  150. PROCEDURE ResetMouseTime;
  151. BEGIN
  152.   MouseTime := MTime * 10 - 10;
  153. END;
  154.  
  155. {*********************************************************
  156.  ** Setzt die Blanker-Zeit wieder auf ihren alten Wert  **
  157.  ** zurück.                                             **
  158.  *********************************************************}
  159. PROCEDURE ResetTime;
  160. BEGIN
  161.   zähler := ScreenTime * 10 - 10;
  162. END;
  163.  
  164. {*********************************************************
  165.  ** Beschleunigt die Maus um Faktor "Factor".           **
  166.  *********************************************************}
  167. PROCEDURE Beschleuniger(VAR ev: p_InputEvent; VAR Factor : Long);
  168. BEGIN
  169.   ev^.ie_position.ie_xy.ie_x := ev^.ie_position.ie_xy.ie_x*Factor;
  170.   ev^.ie_position.ie_xy.ie_y := ev^.ie_position.ie_xy.ie_y*Factor;
  171. END;
  172.  
  173. {*********************************************************
  174.  ** Öffnet den Blanker-Screen.                          **
  175.  *********************************************************}
  176. FUNCTION ScreenÖffnen : Boolean;
  177. BEGIN
  178.   ns := NewScreen(0,0,320,200,3,0,1,0,CUSTOMSCREEN+SCREENQUIET,NIL,NIL,NIL,
  179.                   NIL);
  180.   sp := OpenScreen(^ns);
  181.   IF sp = NIL Then
  182.   BEGIN
  183.     ScreenÖffnen := FALSE;
  184.     DisplayBeep(NIL);
  185.   END ELSE
  186.   BEGIN
  187.     ScreenÖffnen := TRUE;
  188.     rp := ^sp^.RastPort;
  189.   END;
  190. END;
  191.  
  192. {*********************************************************
  193.  ** Schliesst den evtl. geöffneten Screen.              **
  194.  *********************************************************}
  195. PROCEDURE Schliessen;
  196. VAR
  197.   ok : BOOLEAN;
  198. BEGIN
  199.   IF (sp<>NIL) THEN ok := CloseScreen(sp);
  200.   sp := NIL;
  201. END;
  202.  
  203. {*********************************************************
  204.  ** Blanker-MODULE integrieren.                         **
  205.  *********************************************************}
  206. {$path"RAM:Pascal/MagicBlank/","Sources:MagicBlank/";
  207.   incl"STARS.h","BLACKSCR.h","LINES.h","POINTS.h"}
  208.  
  209. {*********************************************************
  210.  ** Input-Device, Port etc. schliessen.                 **
  211.  *********************************************************}
  212. PROCEDURE CloseInput;
  213. BEGIN
  214.   IF ioreq^.io_Device<>NIL THEN CloseDevice(p_IORequest(ioreq));
  215.   IF ioreq<>NIL THEN DeleteStdIO(ioreq);
  216.   IF port<>NIL THEN DeletePort(port);
  217.   IF SigBit<>-1 THEN FreeSignal(SigBit);
  218. END;
  219.  
  220. {*********************************************************
  221.  ** Handler aus dem System entfernen.                   **
  222.  *********************************************************}
  223. PROCEDURE RemHandler;
  224. BEGIN
  225.   ioreq^.io_Data := ^inter;
  226.   ioreq^.io_Command := IND_REMHANDLER;
  227.   err := DoIO (p_IORequest(ioreq));
  228.   IF err <> 0 THEN
  229.   BEGIN
  230.     Schliessen;
  231.     CloseInput;
  232.     IF FromWB THEN
  233.       FOR i := 1 TO 2 DO DisplayBeep(NIL)
  234.     ELSE
  235.     BEGIN
  236.       WriteLn(#27"[1;33mFATALER FEHLER:");
  237.       WriteLn("KANN MEINEN HANDLER NICHT ENTFERNEN !!!!"#27"[0m");
  238.     END;
  239.     Halt(20);
  240.   END;
  241. END;
  242.  
  243. {*********************************************************
  244.  ** Handler ins System einbinden.                       **
  245.  *********************************************************}
  246. PROCEDURE AddHandler;
  247. BEGIN
  248.   ioreq^.io_Data := ^inter;
  249.   ioreq^.io_Command := IND_ADDHANDLER;
  250.   err := DoIO(p_IORequest(ioreq));
  251.   IF err <> 0 THEN
  252.   BEGIN
  253.     Schliessen;
  254.     CloseInput;
  255.     IF FromWB THEN
  256.       FOR i := 1 TO 9 DO DisplayBeep(NIL)
  257.     ELSE
  258.     BEGIN
  259.       WriteLn(#27"[1;33mFATALER FEHLER:");
  260.       WriteLn("KANN MEINEN HANDLER NICHT HINZUFÜGEN !!!!"#27"[0m");
  261.     END;
  262.     Halt(20);
  263.   END;
  264. END;
  265.  
  266. {*********************************************************
  267.  ** Vordefinieren der Variablen (Blanktime etc.).       **
  268.  *********************************************************}
  269. PROCEDURE DoVariables;
  270. BEGIN
  271.   Linkshänder := FALSE;
  272.   prio        := 57;    { Priorität des input-Handlers      }
  273.   blanked     := FALSE; { Ist unser Blank-Screen aktiv ?    }
  274.   MouseFactor := 3;     { Beschleunigungs-Faktor            }
  275.   ScreenTime  := 180;   { Zeit, die verstreichen muß, damit }
  276.                         { unser Blanker wach wird...        }
  277.   MMBShift        := FALSE;
  278.   blanknum        := 1;  { RANDOM-BLANKER }
  279.   shifted         := FALSE;
  280.   lpressed        := FALSE;
  281.   ThisTask := FindTask (Nil);
  282.  
  283.   ScreenSwitcher := TRUE;
  284.  
  285.   MTime := 5; { 5 Sek. bis zum Blanken der Maus. }
  286. END;
  287.  
  288. {*********************************************************
  289.  ** InputDevice etc. öffnen.                            **
  290.  *********************************************************}
  291. FUNCTION OpenInput : BOOLEAN;
  292. BEGIN
  293.   SigBit:=AllocSignal(-1);
  294.   IF SigBit<>-1 THEN
  295.   BEGIN
  296.     port := CreatePort (portname, 0);
  297.     IF port<>NIL THEN
  298.     BEGIN
  299.       ioreq := CreateStdIO (port);
  300.       IF ioreq<>NIL THEN
  301.       BEGIN
  302.         err:=OpenDevice("input.device",0,p_IORequest(ioreq),0);
  303.         IF err=0 THEN
  304.           OpenInput:=TRUE
  305.         ELSE
  306.           OpenInput:=FALSE;
  307.       END ELSE OpenInput:=FALSE;
  308.     END ELSE OpenInput:=FALSE;
  309.   END ELSE OpenInput:=FALSE;
  310. END;
  311.  
  312. {*********************************************************
  313.  ** Kleine Info beim CLI-Start.                         **
  314.  *********************************************************}
  315. PROCEDURE GiveInfo;
  316. BEGIN
  317.   WriteLn(#27"[1;33mMagicBlank V1.40"#27"[0m");
  318.   WriteLn;
  319.   WriteLn(#27"[1m©1993 by Björn Schotte (BOMBERSOFT)"#27"[0m");
  320.   WriteLn;
  321.   WriteLn("Programm kann mit CTRL-C abgebrochen werden !!");
  322.   WriteLn;
  323. END;
  324.  
  325. {*********************************************************
  326.  ** Das Kernstück des Programms: Der Input-Handler.     **
  327.  **                                                     **
  328.  ** Der Compiler darf den STACK NICHT PRÜFEN, da er     **
  329.  ** sonst fälschlicherweise einen Stacküberlauf fest-   **
  330.  ** stellen würde -> GURU !!                            **
  331.  *********************************************************}
  332. {$opt b-,s-}
  333. FUNCTION Handler (data: Ptr; event: p_InputEvent) : p_InputEvent;
  334. CONST
  335.   HotKey = IEQUALIFIER_RALT;
  336. VAR e2    : p_InputEvent;
  337.     p : LONG;
  338.     scr : p_Screen;
  339. BEGIN
  340.   e2 := event;
  341.   { Liste durchgehen }
  342.   WHILE e2 <> NIL DO
  343.   BEGIN
  344.     IF (e2^.ie_class AND IECLASS_TIMER)=IECLASS_TIMER THEN
  345.     BEGIN
  346.       IF MTime > 0 THEN
  347.       BEGIN
  348.         Dec(MouseTime);
  349.         IF (MouseTime <= 0) THEN
  350.         BEGIN
  351.           SPRITE_OFF;
  352.           cc.spr[0].dataa:=0;
  353.           cc.spr[0].datab:=0;
  354.           ResetMouseTime;
  355.         END;
  356.       END;
  357.       IF screentime > 0 THEN
  358.       BEGIN
  359.         Dec(zähler);
  360.         IF (zähler <= 0) AND (blanked = FALSE) THEN
  361.         BEGIN
  362.           ResetTime;
  363.           Signal(ThisTask,SBF_E);
  364.         END ELSE IF (zähler <= 0) AND (blanked = TRUE) THEN
  365.           ResetTime;
  366.       END;
  367.     END ELSE
  368.     IF ((e2^.ie_class AND IECLASS_RAWMOUSE)<>0) THEN
  369.     BEGIN
  370.       SPRITE_ON;
  371.       ResetMouseTime; { Mauszeit wieder zurückstellen. }
  372.       IF blanked THEN
  373.         { Blanker beenden }
  374.         Signal(ThisTask,SBF_F);
  375.       ResetTime; { Zeit wieder neu einstellen }
  376.       IF MouseFactor > 0 THEN
  377.         Beschleuniger(e2,MouseFactor); { Maus beschleunigen }
  378.       IF Linkshänder = TRUE THEN
  379.       BEGIN
  380.         CASE e2^.ie_Code OF
  381.           IECODE_LBUTTON : e2^.ie_Code := IECODE_RBUTTON;
  382.           IECODE_LBUTTON+128: e2^.ie_Code := IECODE_RBUTTON+128;
  383.           IECODE_RBUTTON : e2^.ie_Code := IECODE_LBUTTON;
  384.           IECODE_RBUTTON+128: e2^.ie_Code := IECODE_LBUTTON+128;
  385.         ELSE END;
  386.       END;
  387.       IF (MMBShift = TRUE) THEN
  388.       BEGIN
  389.         CASE e2^.ie_Code OF
  390.           IECODE_LBUTTON: lpressed := TRUE;
  391.           IECODE_LBUTTON+128: lpressed := FALSE;
  392.           IECODE_MBUTTON:
  393.             IF lpressed THEN
  394.             BEGIN
  395.               shifted := TRUE;
  396.               e2^.ie_Class := IECLASS_RAWKEY;
  397.               e2^.ie_Code  := 96;
  398.             END;
  399.           IECODE_MBUTTON+128:
  400.             IF shifted THEN
  401.             BEGIN
  402.               shifted := FALSE;
  403.               e2^.ie_Class := IECLASS_RAWKEY;
  404.               e2^.ie_Code  := 224;
  405.             END;
  406.         ELSE END;
  407.       END;
  408.       IF (ScreenSwitcher = TRUE) THEN
  409.       BEGIN
  410.         CASE e2^.ie_Code OF
  411.           IECODE_MBUTTON:
  412.             BEGIN
  413.               p := LockIBase(0);
  414.               scr := IBase^.FirstScreen;
  415.               IF scr <> NIL THEN ScreenToBack(scr);
  416.               UnLockIBase(p);
  417.             END;
  418.         ELSE END;
  419.       END;
  420.     END ELSE
  421.     IF (e2^.ie_Class AND IECLASS_RAWKEY)<>0 THEN
  422.     BEGIN
  423.       SPRITE_OFF;
  424.       ResetTime;
  425.       Signal(ThisTask,SBF_F);
  426.       IF (e2^.ie_Code = 95) THEN
  427.       BEGIN
  428.         IF (e2^.ie_Qualifier AND HotKey) = HotKey THEN
  429.         BEGIN
  430.           SetKommando(COM_EDIT);
  431.           e2^.ie_Class := IECLASS_NULL;
  432.           Signal(ThisTask, mask);
  433.         END;
  434.       END;
  435.     END;
  436.     IF shifted THEN
  437.       e2^.ie_Qualifier := e2^.ie_Qualifier + IEQUALIFIER_LSHIFT;
  438.     e2 := e2^.ie_NextEvent          { nächstes Element der Liste }
  439.   END; { OF WHILE }
  440.   Handler := event;            { Zeiger auf alte Liste zurückgeben }
  441. END;
  442. {$opt s0}
  443.  
  444.  
  445. PROCEDURE Usage;
  446. VAR
  447.   dum : CHAR;
  448. BEGIN
  449.   WriteLn;
  450.   WriteLn("MagicBlank V1.41 ©1993 by BOMBERSOFT");
  451.   WriteLn;
  452.   Write(CHR(27)+"[32m");
  453.   WriteLn("Dieses Programm darf NICHT verändert werden, außer");
  454.   WriteLn("auf privater Ebene. Dann muß mir aber der VERÄNDERTE");
  455.   WriteLn("Quelltext zugesandt werden !!");
  456.   WriteLn("MagicBlank darf auch auf anderen Serien veröffentlicht");
  457.   WriteLn("werden, aber OHNE Quellcode !!");
  458.   WriteLn;
  459.   WriteLn("Ein ABSOLUTES VERTRIEBSVERBOT gilt für:");
  460.   WriteLn;
  461.   WriteLn("  - OSSOWSKI");
  462.   WriteLn("  - WOLF");
  463.   WriteLn("  - INTERSOFT");
  464.   WriteLn(CHR(27)+"[0m");
  465.   WriteLn("Das Copyright bleibt also bei mir. Wer Vorschläge etc.");
  466.   WriteLn("hat, schreibt mir unter folgender Adresse:");
  467.   WriteLn;
  468.   WriteLn("  BJÖRN SCHOTTE");
  469.   WriteLn("  AM BURKARDSTUHL 45");
  470.   WriteLn("  97267 HIMMELSTADT");
  471.   WriteLn;
  472.   Write("<RETURN> ");
  473.   ReadLn(dum);
  474.   WriteLn;
  475.   WriteLn;
  476.   WriteLn("USAGE:");
  477.   WriteLn;
  478.   WriteLn("  MagicBlank [-?] [-p|P<val>] [-m|M<1|0>] [-l|L<1|0>] [-s|S<1|0>]");
  479.   WriteLn("             [-f|F<val>] [-b|B<val>] [-t|T<val>] [-i|I<val>]");
  480.   WriteLn;
  481.   WriteLn;
  482.   WriteLn("MIT:");
  483.   WriteLn;
  484.   WriteLn("-p<val>  : Handler-Priorität (Bsp.: -p57)");
  485.   WriteLn("-m<1|0>  : m = 1 --> MMBShift aktiviert");
  486.   WriteLn("           m = 0 --> MMBShift deaktiviert");
  487.   WriteLn("-l<1|0>  : l = 1 --> Maustasten vertauschen aktiviert");
  488.   WriteLn("           l = 0 --> Maustasten vertauschen deaktiviert");
  489.   WriteLn("-s<1|0>  : s = 1 --> ScreenSwitcher aktiviert");
  490.   WriteLn("           s = 0 --> ScreenSwitcher deaktiviert");
  491.   WriteLn("-f<val>  : Mausbeschleuinger-Faktor (bei 0 oder 1 DEAKTIVIERT)");
  492.   WriteLn("-b<val>  : Blanknummer zwischen 1 (RANDOM) und 5");
  493.   WriteLn("-t<val>  : Screenblanktime (Bsp.: -t180)");
  494.   WriteLn("-i<val>  : Mausblanktime");
  495.   WriteLn;
  496.   Write(#27"[1;33m");
  497.   WriteLn("MagicBlank ist GIFTWARE. Hope you enjoy this program !!");
  498.   Write(#27"[0m");
  499.   HALT(0);
  500. END;
  501.  
  502. {*********************************************************
  503.  ** Kommandozeile auswerten.                            **
  504.  *********************************************************}
  505. PROCEDURE VonCLI;
  506. VAR
  507.   dum,fehler : INTEGER;
  508. BEGIN
  509.   IF ParameterLen > 0 THEN
  510.   BEGIN
  511.     FOR i := 1 TO ArgNum DO
  512.     BEGIN
  513.       Arg[i] := GetArg(i);
  514.       IF Arg[i][1] = "-" THEN
  515.       BEGIN
  516.         CASE Arg[i][2] OF
  517.           "p","P":
  518.             BEGIN { Handler Priority }
  519.               Delete(Arg[i],1,2);
  520.               Val(Arg[i],dum,fehler);
  521.               IF fehler > 0 THEN Prio := 57
  522.               ELSE
  523.               BEGIN
  524.                 IF dum IN [51..100] THEN Prio := dum ELSE Prio := 57;
  525.               END;
  526.             END;
  527.           "m","M": { MMBShift }
  528.             BEGIN
  529.               IF Arg[i][3]="1" THEN MMBShift := TRUE
  530.                                ELSE MMBShift := FALSE;
  531.             END;
  532.           "l","L": { LeftyMouse }
  533.             BEGIN
  534.               IF Arg[i][3]="1" THEN Linkshänder := TRUE
  535.                                ELSE Linkshänder := FALSE;
  536.             END;
  537.           "s","S": { ScreenSwitcher }
  538.             BEGIN
  539.               IF Arg[i][3]="1" THEN ScreenSwitcher := TRUE
  540.                                ELSE ScreenSwitcher := FALSE;
  541.             END;
  542.           "f","F": { MouseFactor }
  543.             BEGIN
  544.               Delete(Arg[i],1,2);
  545.               Val(Arg[i],dum,fehler);
  546.               IF fehler>0 THEN MouseFactor := 3
  547.               ELSE
  548.               BEGIN
  549.                 IF dum IN [0..9] THEN
  550.                 BEGIN
  551.                   IF dum=0 THEN dum := 1;
  552.                   MouseFactor := dum;
  553.                 END ELSE MouseFactor := 3;
  554.               END;
  555.             END;
  556.           "b","B":
  557.             BEGIN
  558.               Delete(Arg[i],1,2);
  559.               Val(Arg[i],dum,fehler);
  560.               IF fehler>0 THEN blanknum := 1
  561.               ELSE
  562.               BEGIN
  563.                 IF dum IN [1..5] THEN blanknum := dum
  564.                                  ELSE blanknum := 1;
  565.               END;
  566.             END;
  567.           "t","T":
  568.             BEGIN
  569.               Delete(Arg[i],1,2);
  570.               Val(Arg[i],dum,fehler);
  571.               IF fehler>0 THEN ScreenTime := 180
  572.               ELSE ScreenTime := dum;
  573.             END;
  574.           "i","I":
  575.             BEGIN
  576.               Delete(Arg[i],1,2);
  577.               Val(Arg[i],dum,fehler);
  578.               IF fehler=0 THEN MTime := dum;
  579.             END;
  580.           "?" : Usage;
  581.         ELSE END;
  582.       END;
  583.     END;
  584.   END;
  585. END;
  586.  
  587. {*********************************************************
  588.  ** Das Hauptprogramm.                                  **
  589.  *********************************************************}
  590. BEGIN
  591.   IBase := IntuitionBase;
  592.   InterfaceCode :=
  593.     CodeTyp($48E7, $7F00,                    { MOVEM.L d1-d7,-(a7) }
  594.             $48E7, $00FE,                    { MOVEM.L a0-a6,-(a7) }
  595.             $4BF9, Addr(_paslibbase) shr 16,
  596.                    Addr(_paslibbase)and$FFFF,{ LEA _paslibbase,a5  }
  597.             $4EB9, Addr(Handler) shr 16,
  598.                    Addr(Handler) and $FFFF,  { JSR Handler         }
  599.             $4CDF, $7F00,                    { MOVEM.L (a7)+,a0-a6 }
  600.             $4CDF, $00FE,                    { MOVEM.L (a7)+,a1-a7 }
  601.             $4E75                            { RTS                 }
  602.            );
  603.   port := FindPort(portname);
  604.   If port <> NIL Then
  605.   BEGIN
  606.     Signal(port^.mp_SigTask,SIGBREAKF_CTRL_C);
  607.     If FromWB Then
  608.       DisplayBeep(NIL)
  609.     ELSE
  610.     BEGIN
  611.       Writeln("MagicBlank beendet.");
  612.       Writeln;
  613.     END;
  614.     HALT(0);
  615.   END;
  616.   DoVariables;
  617.   IF NOT FromWB THEN VonCLI;
  618.   done:=OpenInput;
  619.   IF done THEN
  620.   BEGIN
  621.     ResetTime;
  622.     ResetMouseTime;
  623.     WITH inter, is_node DO
  624.     BEGIN
  625.       is_Code := ^InterfaceCode;
  626.       is_Data := NIL;
  627.       ln_Name := "MagicBlank-Handler";
  628.       ln_Pri  := prio;
  629.     END;
  630.     mask := 1 SHL SigBit;
  631.     AddHandler;
  632.     GiveInfo;
  633.     done := FALSE;
  634.     REPEAT
  635.       sig:= _Wait(SBF_C or SBF_E or SBF_F or mask);
  636.       IF (sig and SBF_E)=SBF_E THEN
  637.       BEGIN
  638.         blanked := ScreenÖffnen;
  639.         IF blanked THEN
  640.         BEGIN
  641.           SPRITE_OFF;
  642.           cc.spr[0].dataa:=0;
  643.           cc.spr[0].datab:=0;
  644.           SetRGB4(^sp^.ViewPort,0, 0, 0, 0);
  645.           SetRGB4(^sp^.ViewPort,1, 6, 6, 6);
  646.           SetRGB4(^sp^.ViewPort,2,15, 0, 0);
  647.           SetRGB4(^sp^.ViewPort,3, 0,15, 0);
  648.           FOR i := 17 TO 19 DO SetRGB4(^sp^.ViewPort, i, 0, 0, 0);
  649.   weiter:
  650.           IF blanknum = 1 THEN
  651.           BEGIN
  652.             zuf := Random(3);
  653.             Case zuf of
  654.               0 : Points;
  655.               1 : Lines;
  656.               2 : Stars;
  657.             ELSE END;
  658.           END ELSE
  659.           BEGIN
  660.             CASE BlankNum OF
  661.               2 : Stars;
  662.               3 : Points;
  663.               4 : Lines;
  664.               5 : BlackScreen;
  665.             ELSE END;
  666.           END;
  667.           If sig1 = 0 then goto weiter;
  668.           Schliessen;
  669.           blanked := FALSE;
  670.           ResetTime;
  671.         END;
  672.       END ELSE
  673.       IF (sig and SBF_C)=SBF_C THEN
  674.       BEGIN
  675.         done:=TRUE;
  676.       END ELSE
  677.       IF (sig AND mask) = mask THEN
  678.       BEGIN
  679.         { Spätere Erweiterungen !! }
  680.         i := Kommando;
  681.         ClearKommando;
  682.         CASE i OF
  683.           COM_EDIT : {};
  684.         ELSE END;
  685.       END;
  686.     UNTIL done = TRUE;
  687.     RemHandler;
  688.     Schliessen;
  689.     SPRITE_ON;
  690.   END;
  691.   CloseInput;
  692. END.
  693.  
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700.  
  701.  
  702.